#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// #define FILE_NAME(number) "log.txt" #number
#define FILE_NAME "log.txt"


// int main()
// {
//     printf("hello printf\n");
//     fprintf(stdout, "hello fprintf\n");
//     const char* fputsString = "hello fputs\n";
//     fputs(fputsString, stdout);

//     const char* msg = "hello write\n";
//     write(1, msg, strlen(msg));

//     fork();

//     return 0;
// }

// int main()
// {
//     int fd = open(FILE_NAME, O_RDONLY, 0666);
//     if (fd < 0)
//     {
//         perror("open failed");
//         return 1;
//     }

//     int n = dup2(fd, 0);
//     if (n < 0)
//     {
//         perror("dup2");
//         return 2;
//     }

// char buffer[64];
// int cnt = 5;
// while (cnt)
// {
//     sprintf(buffer, "%s:%d\n", "hello world", cnt--);
//     write(1, buffer, strlen(buffer));
// }
// printf("fd:%d\n", fd);
// fprintf(stdout, "fd:%d\n", fd);
// char* msg = "hello redirect\n";
// write(1, msg, strlen(msg));

// fflush(stdout);

//     char buffer[64];
//     while(fgets(buffer,sizeof (buffer) - 1,stdin)!=NULL)
//     {
//         buffer[strlen(buffer)] = 0;
// printf("%s",buffer);
//         puts(buffer);
//     }
//     close(fd);

//     return 0;
// }
// int main()
// {
//     printf("stdin->fd:%d\n",stdin->_fileno);
//     printf("stdout->fd:%d\n",stdout->_fileno);
//     printf("stderr->fd:%d\n",stderr->_fileno);

//     return 0;
// }

// int main()
// {
// close(1);
// close(0);
// close(2);
//     int fd1 = open(FILE_NAME(1),O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd2 = open(FILE_NAME(2),O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd3 = open(FILE_NAME(3),O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd4 = open(FILE_NAME(4),O_WRONLY | O_CREAT | O_TRUNC,0666);
//     int fd5 = open(FILE_NAME(5),O_WRONLY | O_CREAT | O_TRUNC,0666);

//     printf("fd1 : %d\n",fd1);
//     printf("fd2 : %d\n",fd2);
//     printf("fd3 : %d\n",fd3);
//     printf("fd4 : %d\n",fd4);
//     printf("fd5 : %d\n",fd5);

//     close(fd1);
//     close(fd2);
//     close(fd3);
//     close(fd4);
//     close(fd5);

//     return 0;
// }

// #define FILE_NAME "log.txt"

// int main()
// {
// 创建文件并以只写形式打开，并指定文件的默认权限为0666(还受umask的影响)
// 同时，我们可以通过umask接口手动设置当前进程的文件掩码，而不使用从父进程继承过来的umask
//     umask(0000);
//     int fd = open(FILE_NAME, O_RDONLY, 0666);
//     if (fd < 0)
//     {
//         perror("open failed");
//         return 1;
//     }

//     char buffer[1024];
//     ssize_t num = read(fd, buffer, sizeof(buffer) - 1);
//     if (num > 0)
//         buffer[num] = 0; // 0, '\0', NULL -> 0
//     printf("%s", buffer);

// int cnt = 5;
// char buffer[64];

// while (cnt)
// {
//     sprintf(buffer, "%s:%d\n", "hello world", cnt--);
// 注意：这里strlen求得的长度不用加1，因为字符串以'\0'结尾只是C语言的特性，而文件中并不这样规定
//     write(fd, buffer, strlen(buffer));
// }

//     close(fd);
//     return 0;
// }

// 每一个宏只占用一个比特位，该比特位为1说明该选项成立，且各个宏的位置不重叠
// #define OPTION_ONE (1 << 0)
// #define OPTION_TWO (1 << 1)
// #define OPTION_TREE (1 << 2)
// #define OPTION_FOUR (1 << 3)

// void show(int flags)
// {
// flags与上面哪个选项匹配，就执行对应的操作
// 按位与的结果为1，说明flags对应的比特位为1
//     if (flags & OPTION_ONE)
//         printf("OPTION_ONE\n");
//     if (flags & OPTION_TWO)
//         printf("OPTION_TWO\n");
//     if (flags & OPTION_TREE)
//         printf("OPTION_TREE\n");
//     if (flags & OPTION_FOUR)
//         printf("OPTION_FOUR\n");
// }

// int main()
// {
// 主函数中通过传递不同的选项来达到不同的效果
//     show(OPTION_ONE);
//     printf("-----------------------\n");
//     show(OPTION_TWO);
//     printf("-----------------------\n");
//     show(OPTION_ONE | OPTION_TWO);
//     printf("-----------------------\n");
//     show(OPTION_ONE | OPTION_TWO | OPTION_TREE);
//     printf("-----------------------\n");
//     show(OPTION_ONE | OPTION_TWO | OPTION_TREE | OPTION_FOUR);
//     printf("-----------------------\n");

//     return 0;
// }

// #define FILE_NAME "log.txt"

// int main()
// {
//     FILE *fp = fopen(FILE_NAME, "r");
//     if (NULL == fp)
//     {
//         perror("fopen failed");
//         return 1;
//     }

//     char buffer[64];
//     while(fgets(buffer,sizeof (buffer)-1,fp)!=NULL)
//     {
//         buffer[strlen(buffer) - 1] = 0;
//         puts(buffer);
//     }
//     int cnt = 5;
//     while (cnt)
//     {
//         fprintf(fp,"%s:%d\n","hello world",cnt--);
//     }
//     fclose(fp);

//     return 0;
// }